package com.sixonesix.myapplication.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

    // 定义一个名为DRL的类，它继承自RelativeLayout，意味着这个类将拥有RelativeLayout的所有特性并且可以在此基础上进行扩展
    public class DRL extends RelativeLayout {

        // 用于存储当前的绘制类型，初始值为0，不同的值对应不同的绘制图形或操作，具体对应关系在后续代码中体现
        private int mDrawType = 0;

        // 创建一个画笔对象，用于在画布上进行绘制操作，比如绘制图形的轮廓、填充颜色等
        private Paint mPaint = new Paint();

        // 构造函数，接受一个Context对象作为参数，用于创建与特定上下文相关的视图实例
        // 这里调用了另一个构造函数，并传递了null作为AttributeSet参数
        public DRL(Context context) {
            this(context, null);
        }

        // 完整的构造函数，接受一个Context对象和一个AttributeSet对象作为参数
        // Context用于提供与应用程序环境相关的信息，AttributeSet用于从布局文件中获取该视图的属性设置
        public DRL(Context context, AttributeSet attrs) {
            // 调用父类（RelativeLayout）的构造函数，传递相同的参数，确保父类的初始化工作正确完成
            super(context, attrs);
            // 设置画笔为无锯齿效果，这样绘制出的图形边缘会更加平滑
            mPaint.setAntiAlias(true);
            // 设置画笔为防抖动模式，有助于在一些低分辨率或颜色深度有限的设备上获得更好的绘制效果
            mPaint.setDither(true);
            // 设置画笔的颜色为黑色，这将决定绘制图形的轮廓或填充颜色（取决于画笔的绘制风格）
            mPaint.setColor(Color.BLACK);
            // 设置画笔的线宽为3像素，用于绘制图形的轮廓时控制线条的粗细
            mPaint.setStrokeWidth(3);
            // 设置画笔的类型为STROKE，即空心样式，意味着绘制图形时只绘制轮廓而不填充内部区域
            // 如果设置为FILL，则会填充图形内部区域
            mPaint.setStyle(Style.STROKE);

        }

        // onDraw方法是Android视图绘制流程中的一个重要方法，它在绘制下级视图之前被调用
        // 用于绘制当前视图自身的内容，这里主要根据设置的绘制类型来绘制不同的图形
        protected void onDraw(Canvas canvas) {
            // 先调用父类的onDraw方法，确保父类的绘制逻辑也能正常执行，这在继承关系中很重要，可能父类也有一些需要绘制的基础内容
            super.onDraw(canvas);
            // 获取当前布局的实际测量宽度，这个宽度是在布局过程中根据布局规则和父容器的大小等因素确定的
            int width = getMeasuredWidth();
            // 获取当前布局的实际测量高度，同理，也是在布局过程中确定的实际高度
            int height = getMeasuredHeight();
            // 只有当布局的宽度和高度都大于0时，才进行绘制操作，避免在布局未正确初始化或尺寸为0的情况下进行无效绘制
            if (width > 0 && height > 0) {
                // 如果绘制类型为1，即对应绘制矩形的操作
                if (mDrawType == 1) {
                    // 创建一个Rect对象，用于指定矩形的坐标范围，这里设置为从 (0, 0) 到 (width, height)，即覆盖整个布局区域
                    Rect rect = new Rect(0, 0, width, height);
                    // 使用画笔mPaint在画布canvas上绘制矩形，根据之前设置的画笔属性（颜色、线宽、样式等）来绘制
                    canvas.drawRect(rect, mPaint);
                } else if (mDrawType == 2) { // 绘制圆角矩形
                    // 创建一个RectF对象，用于指定圆角矩形的坐标范围，同样覆盖整个布局区域
                    RectF rectF = new RectF(0, 0, width, height);
                    // 使用画笔在画布上绘制圆角矩形，其中30, 30分别是水平和垂直方向的圆角半径
                    canvas.drawRoundRect(rectF, 30, 30, mPaint);
                } else if (mDrawType == 3) { // 绘制圆圈
                    // 计算圆形的半径，取布局宽度和高度中的较小值除以2，确保圆形能够完整地绘制在布局内部
                    int radius = Math.min(width, height) / 2;
                    // 使用画笔在画布上以布局中心 (width / 2, height / 2) 为圆心，radius为半径绘制圆形
                    canvas.drawCircle(width / 2, height / 2, radius, mPaint);
                } else if (mDrawType == 4) { // 绘制椭圆
                    // 创建一个RectF对象，用于指定椭圆的坐标范围，覆盖整个布局区域
                    RectF oval = new RectF(0, 0, width, height);
                    // 使用画笔在画布上绘制椭圆
                    canvas.drawOval(oval, mPaint);
                } else if (mDrawType == 7) {//绘制扇形
// 创建一个Paint对象，Paint类在安卓开发中用于定义绘制图形和文本时的各种属性，
// 比如颜色、线条样式、文字大小等。这里创建了一个新的Paint实例，以便后续设置绘制属性并用于绘制操作。
                    Paint paint = new Paint();
// 设置Paint对象的颜色属性为黑色。Color.BLACK是安卓中预定义的颜色常量，表示黑色。
// 通过这行代码，后续使用该paint进行绘制时，绘制出来的图形轮廓（如果是描边样式）或填充颜色（如果是填充样式）将为黑色。
                    paint.setColor(Color.BLACK);
// 设置Paint对象的绘制风格为描边样式（STROKE）。Style.STROKE是安卓绘图中定义的一种绘制风格，
// 表示只绘制图形的轮廓线，而不会填充图形的内部区域。例如，当使用该paint绘制矩形时，只会绘制出矩形的四条边框，形成一个空心的矩形框。
                    paint.setStyle(Style.STROKE);
                    RectF oval = new RectF(10, 10, 280, 280);
                    //以下5个参数分别是：矩形、浮动起始角度、浮动扫略角度、布尔值、油漆
                    canvas.drawArc(oval, 0, 90, true, paint);

                }else if (mDrawType == 8) {//绘制弧形
                    Paint paint = new Paint();
                     paint.setColor(Color.GRAY);
                     paint.setStyle(Style.STROKE);
                    RectF oval = new RectF(10, 10, 280, 280);
                    //以下5个参数分别是：矩形、浮动起始角度、浮动扫略角度、布尔值、油漆
                    canvas.drawArc(oval, 0, 90, false, paint);

                }else if (mDrawType == 9) {//绘制图像
                    // 创建画笔对象
                    Paint paint = new Paint();
                    paint.setColor(Color.BLUE);
                    // 设置画笔为填充模式
                    paint.setStyle(Paint.Style.FILL);

                    // 绘制圆形
                    canvas.drawCircle(100, 100, 50, paint);

                    // 设置画笔颜色为绿色
                    paint.setColor(Color.GREEN);
                    // 设置画笔为描边模式，线宽为 3 像素
                    paint.setStyle(Paint.Style.STROKE);
                    paint.setStrokeWidth(3);

                    // 绘制矩形
                    canvas.drawRect(150, 150, 250, 250, paint);

                    // 设置画笔颜色为红色
                    paint.setColor(Color.RED);
                    // 设置文本大小为 30 像素
                    paint.setTextSize(30);
                    // 设置画笔抗锯齿，使文本边缘更平滑
                    paint.setAntiAlias(true);
                    // 要绘制的文本内容
                    String text = "Hello, Android!";
                    // 绘制文本，指定文本的起始坐标 (50, 100)
                    canvas.drawText(text, 50, 100, paint);

                    // 设置画笔颜色为红色
                    paint.setColor(Color.RED);
                    // 设置文本大小为 30 像素
                    paint.setTextSize(30);
                    // 设置画笔抗锯齿，使文本边缘更平滑
                    paint.setAntiAlias(true);
                    // 要绘制的文本内容
                    String text1 = "我是孙健雨";
                    // 绘制文本，指定文本的起始坐标 (50, 100)
                    canvas.drawText(text1, 150, 200, paint);


                } else if (mDrawType == 5) { // 绘制矩形及其对角线
                    // 创建一个Rect对象，用于指定矩形的坐标范围，覆盖整个布局区域
                    Rect rect = new Rect(0, 0, width, height);
                    // 先使用画笔在画布上绘制矩形
                    canvas.drawRect(rect, mPaint);
                    // 再使用画笔绘制从左上角 (0, 0) 到右下角 (width, height) 的对角线
                    canvas.drawLine(0, 0, width, height, mPaint);
                    // 接着绘制从左下角 (0, height) 到右上角 (width, 0) 的对角线
                    canvas.drawLine(0, height, width, 0, mPaint);
                }
            }
        }

        // dispatchDraw方法也是Android视图绘制流程中的一部分，它同样在绘制下级视图之前被调用
        // 但与onDraw方法的职责略有不同，通常用于绘制一些需要覆盖在下级视图之上的内容，这里主要根据特定绘制类型绘制图形
        protected void dispatchDraw(Canvas canvas) {
            // 先调用父类的dispatchDraw方法，确保父类相关的绘制逻辑正常执行
            super.dispatchDraw(canvas);

            // 获取当前布局的实际测量宽度
            int width = getMeasuredWidth();
            // 获取当前布局的实际测量高度
            int height = getMeasuredHeight();

            // 只有当布局的宽度和高度都大于0时，才进行绘制操作
            if (width > 0 && height > 0) {
                // 如果绘制类型为6，即对应绘制矩形及其对角线的操作（与onDraw中mDrawType == 5的绘制内容类似，但可能在绘制顺序或覆盖关系上有所不同）
                if (mDrawType == 6) {
                    // 创建一个Rect对象，用于指定矩形的坐标范围，覆盖整个布局区域
                    Rect rect = new Rect(0, 0, width, height);
                    // 先使用画笔在画布上绘制矩形
                    canvas.drawRect(rect, mPaint);
                    // 再使用画笔绘制从左上角 (0, 0) 到右下角 (width, height) 的对角线
                    canvas.drawLine(0, 0, width, height, mPaint);
                    // 接着绘制从左下角 (0, height) 到右上角 (width, 0) 的对角线
                    canvas.drawLine(0, height, width, 0, mPaint);
                }
            }
        }

        // 设置绘制类型的公共方法，外部可以调用此方法来改变当前视图的绘制类型
        public void setDrawType(int type) {
            // 将视图的背景颜色设置为白色，这样做的目的是把画布擦干净，以便根据新的绘制类型重新绘制内容时不会受到之前绘制的影响
            setBackgroundColor(Color.WHITE);
            // 更新当前的绘制类型为传入的type值
            mDrawType = type;
            // 调用invalidate方法，此方法会触发视图的重绘操作，使得onDraw方法和dispatchDraw方法会被再次调用，从而根据新的绘制类型绘制出正确的图形
            invalidate();
        }
    }

